package com.qqtech.qquan.user.service;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.qqtech.core.frame.service.BaseService;
import com.qqtech.qquan.user.enums.UserMoneyLogTypeDictEnum;
import com.qqtech.qquan.user.model.UserMoneyLog;
import com.qqtech.qquan.user.model.UserMoneyLogQuery;
import com.qqtech.qquan.user.model.UserMoneyLogVo;

public interface UserMoneyLogService extends BaseService<UserMoneyLog> {
	/**
	 * 后台查询列表--分页
	 * 
	 * @param query
	 * @param pageable
	 * @return
	 */
	public Page<UserMoneyLogVo> queryPageListAdmin(UserMoneyLogQuery query, Pageable pageable);

	/**
	 * 后台查询--数量
	 * 
	 * @param query
	 * @return
	 */
	public int queryCountAdmin(UserMoneyLogQuery query);

	/**
	 * 后台查询列表--不分页
	 * 
	 * @param query
	 * @param pageable
	 * @return
	 */
	public List<UserMoneyLogVo> queryListAdmin(UserMoneyLogQuery query, Pageable pageable);

	/**
	 * 获取有效的用户额度(余额中扣除提现申请中、提现中这2个状态的金额)
	 * 
	 * @param userId
	 *            用户id
	 * @return 返回有效的额度(单位:人民币元)
	 */
	public double getValidMoney(Integer userId);

	/**
	 * 变更(增或减)用户的账户余额
	 * 
	 * @param userId
	 *            用户id
	 * @param money
	 *            变更余额的值(1圈币=1分钱)
	 * @param remark
	 *            备注
	 * @param type
	 *            交易类型
	 */
	public void addMoneyToUser(Integer userId, Integer money, String remark, UserMoneyLogTypeDictEnum type);

	/**
	 * 用户使用余额支付
	 * 
	 * @param orderNo
	 *            支付的订单号
	 * @param buyerId
	 *            买家id
	 * @param payUserId
	 *            支付的用户id
	 * @param payMoney
	 *            支付额(必须是正数，如果输入负数，则会在接口判断且纠正为正数)
	 * @param remark
	 *            支付备注
	 */
	public void payWithUserMoney(String orderNo, String buyerId, Integer payUserId, Integer payMoney, String remark);

	/**
	 * 用户使用圈币支付
	 * 
	 * @param orderNo
	 *            支付的订单号
	 * @param buyerId
	 *            买家id
	 * @param payUserId
	 *            支付的用户id
	 * @param payMoney
	 *            支付额(必须是正数，如果输入负数，则会在接口判断且纠正为正数)
	 * @param remark
	 *            支付备注
	 */
	public void payWithUserQuan(String orderNo, String buyerId, Integer payUserId, Integer payMoney, String remark,BigDecimal shopDiscountValue,BigDecimal shopDiscountRate);

	/**
	 * 获取有效的用户圈币
	 * 
	 * @param userId
	 *            用户id
	 * @return 返回有效的额度(单位:人民币元)
	 */
	public double getValidQuan(Integer userId);
}